package ru.niir.goodfil;

import com.thoughtworks.xstream.XStream;
import org.apache.commons.beanutils.PropertyUtils;
import ru.niir.goodfil.c1.Client;
import ru.niir.goodfil.c1.Document;
import ru.niir.goodfil.c1.DocumentType;
import ru.niir.goodfil.c1.Rest;
import ru.niir.goodfil.db.GoodfilFactory;
import ru.niir.goodfil.db.handlers.Goodfil;
import ru.niir.goodfil.utils.filters.ClientsFilter;

import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.List;

public class C1Emulator
{
    public static void main(String[] args) throws IOException
    {
        
//        //  Направление обмена 1С - ИС
//        //
//
        XStream xs = Goodwill1C.getXStream();

        //  Клиенты, соответствие записей
        Document document = Document.create(DocumentType.ALL);
        document.getClients().add(new Client(1, 10));
        document.getClients().add(new Client(2, 20));
        document.getClients().add(new Client(3, 30));
        document.getClients().add(new Client(4, 40));
//        xs.toXML(document, new FileWriter(Goodwill1C.generateFileName(ExchangeDirection.C1_TO_IS)));

        //  Остатки товаров
//        document = Document.create(DocumentType.RESTS);
        document.getRests().add(new Rest("111", 1, 1));
        document.getRests().add(new Rest("222", 2, 2));
        document.getRests().add(new Rest("333", 3, 3));
        document.getRests().add(new Rest("444", 4, 4));
//        xs.toXML(document, new FileWriter(Goodwill1C.generateFileName(ExchangeDirection.C1_TO_IS)));

        //  Заказы, изменения статусов
//        document = Document.create(DocumentType.ORDER_STATS);
//        document.getOrderStats().add(new OrderStat("111", "1", "111", 1, "01.01.2000"));
//        document.getOrderStats().add(new OrderStat("222", "2", "222", 2, "02.01.2000"));
//        document.getOrderStats().add(new OrderStat("333", "3", "333", 3, "03.01.2000"));
//        document.getOrderStats().add(new OrderStat("444", "4", "444", 4, "04.01.2000"));
//        xs.toXML(document, new FileWriter(Goodwill1C.generateFileName(ExchangeDirection.C1_TO_IS)));

        //
        //  Направление обмена ИС - 1С
        //
//        document = Document.create(DocumentType.CLIENTS);
        Goodfil gf = GoodfilFactory.getInstance();
        List<ru.niir.goodfil.db.Client> clients = gf.getClients(0, Integer.MAX_VALUE, new ClientsFilter());
        for (ru.niir.goodfil.db.Client client : clients)
        {
            Client c = new Client();
            copy(client, c);
            c.setIdIS(client.getId());
            document.getClients().add(c);
        }
//        xs.toXML(document, new FileWriter(Goodwill1C.generateFileName(ExchangeDirection.IS_TO_C1)));

        //
        //  Заказы, новые и модифицированные
        //
//        document = Document.create(DocumentType.ORDERS);

//        Order o = new Order(1, "1", "1", "1", "01.01.2000");
//        o.getItems().add(new OrderItem("101", 10));
//        o.getItems().add(new OrderItem("102", 7));
//        o.getItems().add(new OrderItem("103", 5));
//        o.getItems().add(new OrderItem("104", 42));
//        o.getItems().add(new OrderItem("105", 10));
//        document.getOrders().add(o);
//
//        o = new Order(2, "1", "1", "1", "01.01.2000");
//        o.getItems().add(new OrderItem("101", 10));
//        o.getItems().add(new OrderItem("102", 7));
//        o.getItems().add(new OrderItem("103", 5));
//        o.getItems().add(new OrderItem("104", 42));
//        o.getItems().add(new OrderItem("105", 10));
//        document.getOrders().add(o);
//
//        o = new Order(3, "1", "1", "1", "01.01.2000");
//        o.getItems().add(new OrderItem("101", 10));
//        o.getItems().add(new OrderItem("102", 7));
//        o.getItems().add(new OrderItem("103", 5));
//        o.getItems().add(new OrderItem("104", 42));
//        o.getItems().add(new OrderItem("105", 10));
//        document.getOrders().add(o);
//
//
//        OutputStream os = new FileOutputStream(Goodwill1C.generateFileName(ExchangeDirection.IS_TO_C1));
//        OutputStreamWriter osw = new OutputStreamWriter(os, "windows-1251");
//        osw.write("<?xml version=\"1.0\" encoding=\"windows-1251\"?>");
//        xs.toXML(document, osw);
//        System.out.println("> " + document.getType());
    }

    public static void copy(Object src, Object dest)
    {
        PropertyDescriptor[] srcInfo = PropertyUtils.getPropertyDescriptors(src);
        PropertyDescriptor[] destInfo = PropertyUtils.getPropertyDescriptors(src);

        for (PropertyDescriptor srcProp : srcInfo)
        {
            if (srcProp.getReadMethod() == null) continue;

            for (PropertyDescriptor destProp : destInfo)
            {
                if (destProp.getWriteMethod() == null) continue;
                if (!srcProp.getName().equals(destProp.getName())) continue;

                //  Copying
                try
                {
                    Object value = PropertyUtils.getProperty(src, srcProp.getName());
                    PropertyUtils.setProperty(dest, destProp.getName(), value);
                }
                catch (IllegalArgumentException e1)
                {
//                    System.out.println("Wrong property type");
                }
                catch (IllegalAccessException e1)
                {
//                    System.out.println("IllegalAccessException");
                }
                catch (InvocationTargetException e2)
                {
//                    System.out.println("It's ok, cause we found NOT SIMPLE property");
                }
                catch (NoSuchMethodException e3)
                {
//                    System.out.println("Error in `copy` function: " + srcProp.getName());
                }
            }
        }
    }

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
}
